home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1997-01-29 | 13.0 KB | 485 lines |
- 10 'ZOUNDS - the Zounds of music - 15 OCT 86 rev. 28 SEP 96
- 20 IF EX$=""THEN EX$="EXIT"
- 30 CLS:KEY OFF
- 40 COLOR 7,0,1
- 50 DIM W$(12,2) 'frequency chart variables
- 60 DIM N$(12) 'names of notes e.g. A,A# etc.
- 70 DIM C$(9) 'names of chords
- 80 DIM AB$(255,2) 'keyboard variables
- 90 DIM X(9) 'fret locations for guitar tuner graphics
- 100 DIM Q$(8) 'menu lines for guitar tuner
- 110 DIM A$(21) 'keyboard variables
- 120 DIM B$(21) 'keyboard variables
- 130 D$=" Hz."
- 140 Q$="ERROR" 'symbol for flat - chr$(167)
- 150 U$="###,###.###"
- 160 UL$=STRING$(80,205)
- 170 LU$=STRING$(80,"<0xDF!>")
- 180 E$=STRING$(80,32)
- 190 GOSUB 4520 'load variables from data
- 200 LOCATE ,,0 'cursor off
- 210 '
- 220 '.....mathematical formulae
- 230 I=0.5 'Increment for halftone
- 240 LF=0.434294 'Log conversion factor to base 10 = 1/log(10)
- 250 Z=LOG(I)*LF 'Octave factor (Z= -.3010301)
- 260 N=12 '12 notes (halftones) per octave
- 270 U=10^(Z/N) 'Halftone increment multiplier (U=.9438742)
- 280 A=440 'Standard Pitch in Hz. for middle A
- 290 X=A*U^9 'Middle C (Start of Octave 4) 9th note below middle A (261.6254)
- 300 Y=A/U^3 'High C (Start of Octave 5) 3rd note above middle A (523.2512)
- 310 SS=335280 'Speed of sound in mm/sec. (1100 ft./sec.,750 m.p.h.)
- 320 '
- 330 COLOR 15,2
- 340 PRINT " THE ZOUNDS OF MUSIC";TAB(57)"by George Murphy VE3ERP ";
- 350 COLOR 1,0:PRINT STRING$(80,223);
- 360 COLOR 7,0
- 370 PRINT " A PROGRAM FOR MUSICIANS, AUDIO ENGINEERS AND CONFIRMED TINKERERS"
- 380 PRINT UL$;
- 390 PRINT " NOTE: In the following programs the symbol ERROR denotes flat, e.g. ";
- 400 PRINT "DERROR,EERROR,GERROR,AERROR,BERROR"
- 410 PRINT " for the musical notes D-flat, E-flat, G-flat, A-flat and B-flat."
- 420 PRINT
- 430 PRINT " Sharps are denoted by the standard # symbol, e.g. C#,D#,F#,G#,A#"
- 440 PRINT UL$;
- 450 PRINT " Press letter in < > to:"
- 460 PRINT UL$;
- 470 PRINT " < a > Generate audio tones"
- 480 PRINT " < b > Play a continuous range of audio tones"
- 490 PRINT " < c > List frequencies of musical tones"
- 500 PRINT " < d > Calculate fret locations for stringed instruments"
- 510 PRINT " < e > Analyze a musical tone"
- 520 PRINT " < f > Analyze an audio frequency or wavelength"
- 530 PRINT " < g > Analyze chords"
- 540 PRINT " < h > Tune your guitar"
- 550 PRINT " < i > Fool around on a Keyboard"
- 560 PRINT " < j > EXIT"
- 570 I$=INKEY$:IF I$=""THEN 570
- 580 IF ASC(I$)>=97 AND ASC(I$)<=106 THEN CLS
- 590 IF I$="a"THEN 4030
- 600 IF I$="b"THEN 3550
- 610 IF I$="c"THEN 1780
- 620 IF I$="d"THEN 710
- 630 IF I$="e"THEN 940
- 640 IF I$="f"THEN 1120
- 650 IF I$="g"THEN 2660
- 660 IF I$="h"THEN 2220
- 670 IF I$="i"THEN 3210
- 680 IF I$="j"THEN CLS:RUN EX$
- 690 GOTO 570
- 700 '
- 710 '......location of frets
- 720 CLS
- 730 COLOR 15,2:PRINT " LOCATIONS OF FRETS "
- 740 COLOR 1,0:PRINT LU$;
- 750 COLOR 7,0
- 760 INPUT " ENTER: Length of string (nut to bridge) ..........";L
- 770 CLS
- 780 W=20
- 790 PRINT TAB(20);"NF";SPC(8);"FB"
- 800 PRINT UL$;
- 810 FOR Z=0 TO W
- 820 IF Z=12 THEN COLOR 15,3 ELSE COLOR 7,0
- 830 S=L-L*U^Z
- 840 IF Z<10 THEN Z$=" "ELSE Z$=""
- 850 PRINT " Fret #";Z$;Z;:PRINT USING "######.###";S,L-S;
- 860 IF Z=0 THEN LOCATE CSRLIN,12:PRINT "(nut)":LOCATE CSRLIN-1
- 870 IF Z=12 THEN PRINT " ....Octave "ELSE PRINT ""
- 880 NEXT Z
- 890 PRINT UL$;
- 900 LOCATE 1,35:PRINT "NF=nut to fret, FB=fret to bridge"
- 910 LOCATE 3,35:PRINT "Length of string=";L
- 920 GOTO 4480
- 930 '
- 940 '.....analyze note
- 950 CLS
- 960 COLOR 15,2:PRINT " ANALYSIS OF A MUSICAL TONE "
- 970 COLOR 1,0:PRINT LU$;
- 980 COLOR 7,0
- 990 K=0:Z=0
- 1000 INPUT " ENTER: Note (add - if flat, + if sharp, e.g A-, A+ ) .......";N$
- 1010 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 1020 Z=ASC(N$):IF Z>96 AND Z<104 THEN MID$(N$,1)=CHR$(Z-32)
- 1030 IF RIGHT$(N$,1)="+"THEN N$=LEFT$(N$,1)+"#"
- 1040 IF RIGHT$(N$,1)="-"THEN N$=CHR$(ASC(LEFT$(N$,1))-1)+"#"
- 1050 IF LEN(N$)=1 THEN N$=N$+" "
- 1060 IF N$="@#"THEN N$="G#"
- 1070 FOR P=1 TO 12:IF N$=LEFT$(N$(P),2) THEN W=Y*U^(13-P):GOTO 1460 'print table
- 1080 NEXT P:BEEP:PRINT " There is no such note as ";N$:GOTO 4480
- 1090 NEXT Z
- 1100 GOTO 4480 'end
- 1110 '
- 1120 '.....analyze frequency
- 1130 CLS
- 1140 COLOR 15,2:PRINT " FREQUENCY ANALYSIS "
- 1150 COLOR 1,0:PRINT LU$;
- 1160 COLOR 7,0
- 1170 PRINT" (Press <ENTER> if you wish to enter wavelength)"
- 1180 PRINT
- 1190 INPUT " Frequency (Hz.) if known ...";F
- 1200 IF F THEN 1260
- 1210 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 1220 INPUT " Wavelength (mm) in air, if known ...";F
- 1230 IF F<>0 THEN F=SS/F
- 1240 IF F THEN 1260
- 1250 GOTO 1190
- 1260 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 1270 A=F
- 1280 YY=LOG(F/X):ZZ=LOG(2)
- 1290 V=INT(YY/ZZ):W=F/2^V:T=X*SQR(U) 'W=HALFTONE, T=QUARTERTONE
- 1300 FOR P=12 TO 1 STEP-1
- 1310 T=T/U:N$=N$(P)
- 1320 IF W>=T THEN 1390
- 1330 Z=F:GOSUB 1680
- 1340 PRINT TAB(4)" Frequency =";TAB(19)USING U$;Z;:PRINT D$;
- 1350 GOSUB 1700:COLOR 0,7:LOCATE CSRLIN,4
- 1360 PRINT " Nearest musical tone is highlighted in the table below "
- 1370 COLOR 7,0
- 1380 GOTO 1420
- 1390 NEXT P
- 1400 GOTO 1330
- 1410 '
- 1420 FOR J=1 TO 12:IF N$(J)=N$ THEN W=Y*U^J:GOTO 1460
- 1430 NEXT J
- 1440 END
- 1450 '
- 1460 '.......print table
- 1470 V=V+1
- 1480 Z=W:GOSUB 1680
- 1490 PRINT " Middle ";N$;" =";TAB(19)USING U$;Z;:PRINT D$;:A=W:GOSUB 1700
- 1500 LOCATE CSRLIN-1,65:PRINT "( Octave 4 ) ";
- 1510 PRINT UL$;
- 1520 W=W/2^4:COL=0
- 1530 FOR V=-4 TO 12
- 1540 IF V<10 THEN C$=" "ELSE C$=""
- 1550 Z1=W*2^V:Z2=W*2^(V+1):Z3=(Z1+Z2)/2
- 1560 IF I$="e" AND V=4 THEN COLOR 0,15:GOTO 1600
- 1570 IF COL=1 THEN COLOR 0,15:COL=0:GOTO 1600
- 1580 IF I$="f"AND F>=Z1 AND F<Z3 THEN COLOR 0,15
- 1590 IF I$="f"AND F>Z3 AND F<=Z2 THEN COL=1
- 1600 PRINT " Octave";C$;V;N$;" =";TAB(19)USING U$;Z1;:PRINT D$;
- 1610 A=Z1:GOSUB 1700
- 1620 COLOR 7,0:NEXT V
- 1630 PRINT UL$;
- 1640 LOCATE 1,41:PRINT "The symbol ERROR denotes flat
- 1650 LOCATE 24,1
- 1660 GOTO 4480 'end
- 1670 '
- 1680 IF Z<0.000999999 THEN Z=0:RETURN
- 1690 Z=INT(1000*Z+0.5)/1000:RETURN
- 1700 R$="m":Z=SS/A:IF Z<0.000999999 THEN 1740
- 1710 IF Z>=10 THEN Z=Z/10:R$="c"
- 1720 IF Z>=100 THEN Z=Z/100:R$=""
- 1730 GOSUB 1680
- 1740 PRINT TAB(38)"Wavelength =";USING U$;Z;:PRINT" ";R$;"m ";
- 1750 IF V=4 THEN PRINT"(middle octave)"ELSE PRINT ""
- 1760 RETURN
- 1770 '
- 1780 '.....musical scale
- 1790 CLS
- 1800 COLOR 15,2:PRINT " FREQUENCIES (Hz.) of MUSICAL TONES "
- 1810 COLOR 1,0:PRINT LU$;
- 1820 COLOR 7,0
- 1830 PRINT " The symbol ";:COLOR 15:PRINT "ERROR";:COLOR 7:PRINT " signifies flat.";
- 1840 PRINT " Octave 4 is the range from middle C to middle B";
- 1850 PRINT TAB(6)"Frequencies are rounded off. ";
- 1860 PRINT "Use other programs for more exact figures.";
- 1870 PRINT UL$;
- 1880 LOCATE CSRLIN-1,7:PRINT "FN"
- 1890 FOR P=1 TO 12
- 1900 W$(P,1)=N$(P)
- 1910 W$(P,2)=STR$(Y*U^(13-P)/16)
- 1920 NEXT P
- 1930 PRINT TAB(7);"CALL";TAB(40);"OCTAVE"
- 1940 PRINT " Note CALL";TAB(40);"SOUNDSOUNDSOUNDSOUNDSOUNDSOUND"
- 1950 PRINT " CALL";
- 1960 FOR Z=-1 TO 10 'print column headings (octaves)
- 1970 COLOR 7,0:IF Z=4 THEN COLOR 15,0
- 1980 PRINT USING "######";Z;
- 1990 NEXT Z
- 2000 PRINT UL$;
- 2010 LOCATE CSRLIN-1,7:PRINT "INSTR"
- 2020 FOR Z=1 TO 12 'print rows
- 2030 PRINT " ";W$(Z,1);TAB(7);"CALL"; 'key
- 2040 FOR P=-1 TO 10 'columns
- 2050 Q=VAL(W$(Z,2))*2^P
- 2060 IF Q>27.49 AND Q<4186.1 THEN COLOR 15,1 ELSE COLOR 7,0
- 2070 IF Q<100 THEN V$="####.#"ELSE V$="######"
- 2080 PRINT USING V$;Q;
- 2090 ' PLAY"mbo3t255l64ml"
- 2100 ' PLAY LEFT$(W$(Z,1),2)
- 2110 NEXT P
- 2120 PRINT ""
- 2130 NEXT Z
- 2140 PRINT " CALL";
- 2150 PRINT TAB(14);:COLOR 15,1
- 2160 PRINT " Highlighted notes are the notes on a standard 88 key piano."
- 2170 COLOR 7,0
- 2180 PRINT UL$;
- 2190 LOCATE CSRLIN-1,7:PRINT "STEP"
- 2200 GOTO 4480
- 2210 '
- 2220 '.....tune guitar
- 2230 CLS
- 2240 COLOR 15,2:PRINT " GUITAR TUNER "
- 2250 COLOR 1,0:PRINT LU$;
- 2260 COLOR 7,0
- 2270 PLAY"ml"
- 2280 FOR Z=7 TO 17 STEP 2
- 2290 LOCATE Z:PRINT TAB(11)STRING$(68,45)
- 2300 NEXT Z
- 2310 FOR Z=1 TO 9
- 2320 FOR Y=7 TO 17
- 2330 LOCATE Y,X(Z):PRINT "CSRLIN" 'print frets
- 2340 NEXT Y
- 2350 NEXT Z
- 2360 GOSUB 2380:GOTO 2440
- 2370 '
- 2380 FOR Z=1 TO 8
- 2390 LOCATE(2*Z+5),1
- 2400 PRINT " ";Q$(Z);
- 2410 NEXT Z
- 2420 RETURN
- 2430 '
- 2440 COLOR 15,3
- 2450 LOCATE 4,6:PRINT " Press number in ( ) to tune a string or stop program: "
- 2460 COLOR 7,0
- 2470 Z$=INKEY$
- 2480 Z=VAL (Z$):IF Z<1 OR Z>8 THEN 2470
- 2490 LOCATE 4:PRINT E$;
- 2500 IF Z=1 THEN M$="o3e"
- 2510 IF Z=2 THEN M$="o2b"
- 2520 IF Z=3 THEN M$="o2g"
- 2530 IF Z=4 THEN M$="o2d"
- 2540 IF Z=5 THEN M$="o1a"
- 2550 IF Z=6 THEN M$="o1e"
- 2560 IF Z=7 THEN 2310
- 2570 IF Z=8 THEN 4500
- 2580 LOCATE Z*2+5:COLOR 15,0:PRINT " CSRLINCSRLINCSRLIN"
- 2590 COLOR 15,3
- 2600 LOCATE 4,6:PRINT " Press another number to continue...."
- 2610 COLOR 7,0
- 2620 PLAY M$
- 2630 Z$=INKEY$
- 2640 IF Z$=""THEN 2620 ELSE COLOR 7,0:GOSUB 2380:GOTO 2480
- 2650 '
- 2660 '.....chords
- 2670 CLS
- 2680 COLOR 15,2:PRINT " CHORD STRUCTURE "
- 2690 COLOR 1,0:PRINT LU$;
- 2700 COLOR 7,0
- 2710 A=0
- 2720 PLAY"o2"
- 2730 PRINT " Press letter in < > for desired key.....( ERROR denotes flat ):"
- 2740 PRINT UL$;
- 2750 FOR Z=1 TO 12:PRINT TAB(18);"<";CHR$(Z+103);"> ";N$(Z):NEXT Z
- 2760 Z$=INKEY$:IF Z$=""THEN 2760
- 2770 Z=ASC(Z$):IF Z<104 OR Z>115 THEN 2760
- 2780 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 2790 '
- 2800 N=Z-103
- 2810 PRINT " CHORDS IN THE KEY OF ";N$(N)
- 2820 PRINT UL$;
- 2830 PRINT " Press number in ( ) for desired chord:"
- 2840 PRINT UL$;
- 2850 FOR Z=1 TO 9
- 2860 CH$(Z)=N$(N)+" "+C$(Z)
- 2870 PRINT TAB(17);"(";Z;") ";CH$(Z)
- 2880 NEXT Z
- 2890 Z$=INKEY$:X=VAL (Z$):IF X=0 THEN 2890
- 2900 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 2910 CH$=CH$(X)
- 2920 PRINT " The notes in ";CH$;" are.....( ERROR signifies flat ):"
- 2930 PRINT UL$;
- 2940 IF X=1 THEN A=1:B=5:C=8:D=1 :E=0:P$="ceg>c" 'maj
- 2950 IF X=2 THEN A=1:B=5:C=8:D=10:E=1:P$="cega>c" '6
- 2960 IF X=3 THEN A=1:B=5:C=8:D=11:E=1:P$="cegb->c" '7
- 2970 IF Y=13 THEN Z$=STRING$(3,"_")ELSE Z$=STRING$(3," ")
- 2980 IF X=4 THEN A=1:B=5:C=8:D=12:E=1:P$="cegb>c" 'maj 7
- 2990 IF X=5 THEN A=1:B=4:C=7:D=10:E=1:P$="ce-g-a>c" 'dim
- 3000 IF X=6 THEN A=1:B=5:C=9:D=1 :E=0:P$="ceg+>c" 'aug
- 3010 IF X=7 THEN A=1:B=4:C=8:D=1 :E=0:P$="ce-g>c" 'min
- 3020 IF X=8 THEN A=1:B=4:C=8:D=10:E=1:P$="ce-ga>c" 'min 6
- 3030 IF X=9 THEN A=1:B=4:C=8:D=11:E=1:P$="ce-gb->c" 'min 7
- 3040 Q(1)=N-1+A:IF Q(1)>12 THEN Q(1)=Q(1)-12
- 3050 Q(2)=N-1+B:IF Q(2)>12 THEN Q(2)=Q(2)-12
- 3060 Q(3)=N-1+C:IF Q(3)>12 THEN Q(3)=Q(3)-12
- 3070 Q(4)=N-1+D:IF Q(4)>12 THEN Q(4)=Q(4)-12
- 3080 Q(5)=N-1+E:IF Q(5)>12 THEN Q(5)=Q(5)-12
- 3090 IF E=0 THEN Q(5)=0 'triad
- 3100 FOR Z=1 TO 5
- 3110 COLOR 15,4
- 3120 PRINT " ";N$(Q(Z)),
- 3130 NEXT Z
- 3140 COLOR 7,0:PRINT UL$;
- 3150 PRINT " To stop music press any key.
- 3160 PRINT " The music will stop when the chord being played is finished."
- 3170 PLAY"L4o2":PLAY P$
- 3180 IF INKEY$=""THEN 3170
- 3190 GOTO 4500
- 3200 '
- 3210 '.....keyboard
- 3220 CLS
- 3230 COLOR 15,2:PRINT " ELECTRONIC KEYBOARD "
- 3240 COLOR 1,0:PRINT LU$;
- 3250 COLOR 7,0
- 3260 COLOR 0,7
- 3270 RO=5 'row
- 3280 CO=16 'column
- 3290 LOCATE RO+0,CO:PRINT"CALL INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLIN
- 3300 LOCATE RO+1,CO:PRINT"CALL INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLIN
- 3310 LOCATE RO+2,CO:PRINT"CALL INKEY$2OFF INKEY$3OFF CALL INKEY$5OFF INKEY$6OFF INKEY$7OFF CALL INKEY$9OFF INKEY$0OFF CALL INKEY$=OFF INKEY$CSRLIN
- 3320 LOCATE RO+3,CO:PRINT"CALL INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLINOFF CALL INKEY$CSRLINOFF INKEY$CSRLIN
- 3330 LOCATE RO+4,CO:PRINT"CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL CALL
- 3340 LOCATE RO+5,CO:PRINT"CALL q CALL w CALL e CALL r CALL t CALL y CALL u CALL i CALL o CALL p CALL [ CALL ] CALL
- 3350 LOCATE RO+6,CO:PRINT"MOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTOR
- 3360 LOCATE RO+7,CO:PRINT" C D E F G A B C D E F G "
- 3370 LOCATE RO+2,CO-10:PRINT " Rest: [1]"
- 3380 LOCATE RO+10
- 3390 COLOR 7,0
- 3400 PRINT " To play a note, press the number/letter ";
- 3410 PRINT "on any piano key in the diagram."
- 3420 PRINT
- 3430 PRINT " To play a rest press [1]."
- 3440 PRINT
- 3450 PRINT " To return to menu press SPACE BAR "
- 3460 PLAY"t255L64ml"
- 3470 FOR Z=1 TO 21:A=ASC(A$(Z)):AB$(A,2)=B$(Z):NEXT Z
- 3480 Z$=INKEY$:IF Z$=""THEN 3480
- 3490 IF Z$=" "THEN 4500
- 3500 A=ASC(Z$)
- 3510 Q$=INKEY$:IF Q$=""THEN PLAY AB$(A,2):GOTO 3510
- 3520 Z$=Q$:GOTO 3490
- 3530 PLAY AB$(A,2):GOTO 3480
- 3540 '
- 3550 '.....continuous range of tones
- 3560 CLS
- 3570 COLOR 15,2:PRINT " CONTINUOUS RANGE OF TONES "
- 3580 COLOR 1,0:PRINT LU$;
- 3590 COLOR 7,0
- 3600 GOSUB 4350
- 3610 PRINT UL$;
- 3620 PRINT " The computer's range is from 32767 Hz. to 37 Hz."
- 3630 PRINT UL$;
- 3640 INPUT " ENTER: At what frequency do you want to start";X
- 3650 IF X>=37 AND X<=32767 THEN 3670
- 3660 LOCATE CSRLIN-1:PRINT E$;:LOCATE CSRLIN-1:GOTO 3640
- 3670 VIEW PRINT 3 TO 24:CLS:VIEW PRINT
- 3680 '
- 3690 '.....start tone
- 3700 LOCATE 5:PRINT " Press any key to halt
- 3710 LOCATE 3:PRINT " Audio frequency (Hz.)=
- 3720 N=X/10:A=EXP(LOG(37/X)/N)
- 3730 FOR Z=1 TO N
- 3740 IF INKEY$<>""THEN 3840
- 3750 Y=X*A^Z
- 3760 LOCATE 3,24:PRINT CINT(Y)
- 3770 SOUND Y,1
- 3780 NEXT Z
- 3790 LOCATE 3,24:PRINT " 37"
- 3800 SOUND 37,25
- 3810 PRINT
- 3820 PRINT " THAT's as low as the computer goes!":PRINT:GOTO 3940
- 3830 '
- 3840 SOUND Y,25 'sustain tone for short time
- 3850 LOCATE 5,1
- 3860 PRINT " Press <1> to continue"
- 3870 PRINT
- 3880 PRINT " Press <0> to quit "
- 3890 Y$=INKEY$
- 3900 IF Y$="1"OR Y$="0"THEN VIEW PRINT 4 TO 24:CLS:VIEW PRINT
- 3910 IF Y$="1"THEN X=Y:GOTO 3700
- 3920 IF Y$="0"THEN LOCATE 5:GOTO 3940
- 3930 GOTO 3890
- 3940 PRINT " Press <1> to run again"
- 3950 PRINT
- 3960 PRINT " Press <0> to return to menu"
- 3970 Z$=INKEY$
- 3980 IF Z$="1"THEN 3560
- 3990 IF Z$="0"THEN 4500
- 4000 IF Y=37 THEN SOUND Y,3
- 4010 GOTO 3970
- 4020 '
- 4030 '.....tone generator
- 4040 CLS
- 4050 COLOR 15,2:PRINT " TONE GENERATOR "
- 4060 COLOR 1,0:PRINT LU$;
- 4070 COLOR 7,0
- 4080 GOSUB 4350 'warning
- 4090 PRINT UL$;
- 4100 GOTO 4160
- 4110 '
- 4120 INPUT " ENTER: Frequency (between 37Hz and 32767Hz)=";F
- 4130 IF F>=37 AND F<=32767 THEN RETURN
- 4140 LOCATE 3:PRINT E$;:LOCATE 3:GOTO 4120
- 4150 '
- 4160 GOSUB 4120:F1=F:F2=F
- 4170 PRINT:PRINT " Do you want to generate a second tone? (y/n)
- 4180 Z$=INKEY$:IF Z$="n"THEN 4210
- 4190 IF Z$="y"THEN PRINT:GOSUB 4120:F2=F:GOTO 4210
- 4200 GOTO 4180
- 4210 FOR Z=3 TO CSRLIN-1:LOCATE Z:PRINT E$;:NEXT Z:LOCATE 3
- 4220 IF F1=F2 THEN Z$=""ELSE Z$="1"
- 4230 PRINT " Tone ";Z$;" =";F1;"Hz."
- 4240 IF F2=F1 THEN 4270
- 4250 PRINT " Tone ";"2 =";F2;"Hz."
- 4260 LOCATE CSRLIN-1,25:PRINT "Tones are at 1/2 Second intervals
- 4270 PRINT UL$;
- 4280 PRINT " Press any key to stop....."
- 4290 Z$=INKEY$
- 4300 IF Z$<>""THEN 4500
- 4310 SOUND F1,9.1
- 4320 SOUND F2,9.1
- 4330 GOTO 4290
- 4340 '
- 4350 '.....warning
- 4360 COLOR 12,0:T=6
- 4370 PRINT TAB(T);
- 4380 PRINT "WARNING! If you can't hear some of the high frequency tones you"
- 4390 PRINT TAB(T);
- 4400 PRINT "generate don't blame your computer - it's probably because you are"
- 4410 PRINT TAB(T);
- 4420 PRINT "either getting long in the tooth or have spent too much of your"
- 4430 PRINT TAB(T);
- 4440 PRINT "mis-spent youth listening to cranked-up Rock'n'Roll."
- 4450 COLOR 7,0
- 4460 RETURN
- 4470 '
- 4480 '.....end
- 4490 GOSUB 4720
- 4500 CLS:ERASE W$,N$,C$,AB$,X,Q$,A$,B$:RESTORE:GOTO 10
- 4510 '
- 4520 '.....data
- 4530 DATA "C ","C#/DERROR","D ","D#/EERROR","E ","F "
- 4540 DATA "F#/GERROR","G ","G#/AERROR","A ","A#/BERROR","B "
- 4550 FOR Z=1 TO 12:READ N$(Z):NEXT Z 'names of keys
- 4560 '
- 4570 DATA maj,6,7,maj 7,dim,aug,min,min 6,min 7
- 4580 FOR Z=1 TO 9:READ C$(Z):NEXT Z 'names of chords
- 4590 '
- 4600 DATA 10,11,23,34,44,53,61,68,74
- 4610 FOR Z=1 TO 9:READ X(Z):NEXT Z 'location of frets
- 4620 '
- 4630 DATA (1) E,(2) B,(3) G,(4) D,(5) A,(6) E,(7) Stop sound,(8) EXIT
- 4640 FOR Z=1 TO 8:READ Q$(Z):NEXT Z 'guitar strings menu
- 4650 '
- 4660 DATA q,o2c,2,o2c+,w,o2d,3,o2d+,e,o2e,r,o2f,5,o2f+,t,o2g,6,o2g+,y,o2a
- 4670 DATA 7,o2a+,u,o2b,i,o3c,9,o3c+,o,o3d,0,o3d+,p,o3e,[,o3f,=,o3f+,],o3g
- 4680 DATA " ",p64
- 4690 FOR Z=1 TO 21:READ A$(Z),B$(Z):NEXT Z 'keyboard notes
- 4700 RETURN
- 4710 '
- 4720 'HARDCOPY
- 4730 GOSUB 4840:LOCATE 25,2:COLOR 14,6
- 4740 PRINT " Press 1 to print screen, 2 to print screen & ";
- 4750 PRINT "advance paper, or 3 to continue.";:COLOR 7,0
- 4760 Z$=INKEY$:IF Z$="3"THEN GOSUB 4840:RETURN
- 4770 IF Z$="1"OR Z$="2"THEN GOSUB 4840:GOTO 4790
- 4780 GOTO 4760
- 4790 FOR QX=1 TO 24:FOR QY=1 TO 80
- 4800 LPRINT CHR$(SCREEN(QX,QY));
- 4810 NEXT QY:NEXT QX
- 4820 IF Z$="2"THEN LPRINT CHR$(12)
- 4830 GOTO 4730
- 4840 LOCATE 25,1:PRINT STRING$(80,32);:RETURN
-